#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>


int main()
{
	char* fmt = "%d ";
	char s[] = "Pwn The World";
	int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

	printf("一、遍历字符数组（使用strlen函数）\n");
	//一、遍历字符数组（使用strlen函数）
	_asm {
		//eax = strlen(s)
		lea	eax, s
		push eax
		call strlen
		add esp, 4
		mov ecx, eax

		mov esi, 0
loop_s1:
		cmp ecx, 0
		jz	out_loop1
		// putchar([s + esi])
		mov eax, dword ptr [s + esi]
		push ecx	// 保护 ecx
		push eax
		call putchar
		add esp, 4
		pop ecx		//	取出 ecx
		dec ecx
		inc esi
		jmp loop_s1
out_loop1:
	}


	//二、遍历字符数组（使用loop指令）
	printf("\n二、遍历字符数组（使用loop指令）\n");
	_asm {
		//eax = strlen(s)
		lea	eax, s
		push eax
		call strlen
		add esp, 4
		mov ecx, eax

		xor esi, esi	//数组下表清零
loop_s2:
		// putchar([s + esi])
		mov eax, dword ptr[s + esi]
		push ecx	// 保护 ecx
		push eax
		call putchar
		add esp, 4

		//putchar('\n')
		mov eax, '\n'
		push eax
		call putchar
		add esp, 4
		pop ecx		//	取出 ecx
		inc esi
		loop loop_s2
	}
 
	//三、遍历字符数组（通过'\0'判断）
	printf("\n三、遍历字符数组（通过\'\\0\'判断）\n");
	_asm {
		xor esi, esi	// 下标清零
loop_s3:
		mov al, [s + esi]
		cmp al, 0		// 判断字符是否为'\0'
		jz	out_loop3
		// putchar([s + esi])
		push eax
		call putchar
		add esp, 4
		inc esi		// 数组下标加1
		jmp loop_s3
out_loop3:
	}

	//四、遍历INT数组（使用数组长度判断）
	printf("\n四、遍历INT数组（使用数组长度判断）\n");
	_asm {
		xor esi, esi
loop_i:
		cmp esi, 10
		jge out_loop4
		//printf("%d ", arr[esi]);
		mov eax, dword ptr [arr + esi * 4]	// int的长度为4字节
		push eax
		push fmt
		call printf
		add esp, 8
		inc esi		//增加数组下标
		jmp loop_i
out_loop4:
	}

	return 0;
}